package com.briup.corejava.day10.pojo;

/**
 * 内部类和外部类的关系
 */
public class Outer {
    private String s;
    private static int a;
    public Outer(){
        System.out.println("outer的构造器");
    }

    // 访问成员内部类中的成员
    public void visitMemberInMemberInner(){
        // 直接创建对象即可
        MemberInner memberInner = new MemberInner();
        System.out.println(memberInner.s);
        memberInner.mRun();
    }
    public static void visitStaticInStaticInner(){
        // 外部类访问静态内部类成员
        StaticInner staticInner = new StaticInner();
        System.out.println(staticInner.s);
        staticInner.sRun();
        System.out.println(StaticInner.a);
        StaticInner.ssRun();
    }

    // 成员内部类
    public class MemberInner{
        private String s;
        public void mRun(){
            // 内部类访问外部类的成员
            System.out.println(Outer.this.s);
            System.out.println(Outer.a);
            Outer.this.innerTest();
            System.out.println("成员内部类的非静态方法");
        }
        // 成员内部类不能定义静态的属性和方法

    }
    // 静态内部类
    public static class StaticInner{
        private String s;
        private static int a;
        public void sRun(){
            // 静态内部类中不能调用外部类非静态成员
            System.out.println(Outer.a);
            Outer.visitStaticInStaticInner();
            System.out.println("静态内部类的非静态方法");
        }
        public static void ssRun(){
            System.out.println("静态内部类的静态方法");
        }
    }
    // 局部内部类
    public void innerTest(){
        int a = 200;
        // 要定义在方法内部
        class LocalInner{
            private String s;
            public void lRun(){
                // a = 30;
                // System.out.println(a);
                System.out.println(Outer.this.s);
                Outer.this.visitMemberInMemberInner();
                System.out.println(Outer.a);
                Outer.visitStaticInStaticInner();
            }
        }
        // 局部内部类的对象只能在方法内使用
        // 并且使用的顺序必须在声明之后
        LocalInner localInner = new LocalInner();
        System.out.println(localInner.s);
        localInner.lRun();
    }
}
